home *** CD-ROM | disk | FTP | other *** search
/ NeXT Education Software Sampler 1992 Fall / NeXT Education Software Sampler 1992 Fall.iso / Programming / Classes / serialComm / serialCommDeviceTest.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-08-03  |  5.4 KB  |  183 lines

  1. #import "SerialCommDevice.h"
  2. #import <stdio.h>
  3. #import <libc.h>
  4. #import </usr/include/ansi/limits.h>
  5. /*    serialCommDeviceTest
  6.     synopsis: Test program for the SerialCommDevice Class.  Transfers random-length records
  7.     containing random binary data.  
  8.  
  9.     description: read/write specified serial port.
  10.     
  11.     usage:    serialCommDeviceTest {-r|-w} {-a|-b} [-s<n> -l -d]
  12.          -r or -w specifies read or write respectively the specified port.
  13.         -a or -b specifies /dev/ttya or /dev/ttyb port respectively.
  14.         -l specifies loopback mode - read side copies data back to write side.
  15.         -d toggles debug mode.
  16.         -s<n> baud-rate, where n ==1==50baud==min and n==15==38.4Kbaud==max.
  17.  */
  18.  
  19. #define USE_RANDOM                        
  20. // #define TEST_ONLY
  21. #define BUFFER_SIZE                     (1024*8)
  22. #define FIXED_TRANSFER_SIZE                4000    /* must be multiple of ints. */
  23. #define TRANSFERS                        100
  24. static int            debugFlag =         1;
  25. static id            serialDevice =         nil;
  26.  
  27. @interface MySCDDelegate : SCDDelegate
  28. {
  29. }
  30. -oolMessage:(char *)bufr len:(int)l;
  31. @end
  32.  
  33. @implementation MySCDDelegate
  34. -oolMessage:(char *)bufr len:(int)l
  35. {
  36.     bufr[l] = '\0';
  37.     fprintf(stderr,"\nReceived OOL message:[%s]\n", bufr);
  38.     return self;
  39. }
  40. @end
  41.  
  42. int main(int argc, char **argv)
  43. {
  44.     int                i;
  45.     int             arg=                1;
  46.     int                retVal =             0;
  47.     int                len =                 0;
  48.     int                loop =                 0;
  49.     id                sccOOLDelegate =     nil;
  50.     int                minTransferTime=    INT_MAX;
  51.     int                maxTransferTime=    0;
  52.     int                totalTransferTime=    0;
  53.     int                totalTransfers=        0;
  54.     int                transferTime=        0;
  55.     int                totalCharacters=    0;
  56.     int                readFlag =             0;
  57.     int                loopBackFlag =         0;
  58.     sccPortType        port=                sccPortA;
  59.     baudRateType    baudRate=            brNone;
  60.     char            iBuf[BUFFER_SIZE],oBuf[BUFFER_SIZE];
  61.  
  62.     srandom(57);
  63.     while (argc > arg) {
  64.         if (argv[arg][0] == '-') {
  65.             if ((argv[arg][1] == 'r') || (argv[arg][1] == 'R')) {
  66.                 readFlag = 1;
  67.             } else if ((argv[arg][1] == 'w') || (argv[arg][1] == 'W')) {
  68.                 readFlag = 0;
  69.             } else if ((argv[arg][1] == 'l') || (argv[arg][1] == 'L')) {
  70.                 loopBackFlag = 1; 
  71.             } else if ((argv[arg][1] == 'a') || (argv[arg][1] == 'A')) {
  72.                 port = sccPortA;
  73.             } else if ((argv[arg][1] == 'b') || (argv[arg][1] == 'B')) {                
  74.                 port = sccPortB;
  75.             } else if ((argv[arg][1] == 'd') || (argv[arg][1] == 'D')) {                
  76.                 debugFlag = !debugFlag;
  77.             } else if ((argv[arg][1] == 's') || (argv[arg][1] == 'S')) {                
  78.                 baudRate = atoi(&argv[arg][2]);
  79.                 if (baudRate < BR_MIN || baudRate > BR_MAX)
  80.                     baudRate = br38400;
  81.             } else {
  82.                 fprintf(stderr,"\n%s is an unknown switch.\n",argv[arg]);
  83.                 retVal = 1;
  84.             }
  85.         }
  86.         arg++;
  87.     }
  88.     
  89.     if (debugFlag) {
  90.         fprintf(stderr,"\n%sing port %s in %s mode at br:%d using %s transfers\n",readFlag?"Read":"Writ", 
  91.             (port==sccPortA)?"A":"B", loopBackFlag?"Loopback":"Normal", baudRate, 
  92. #ifdef USE_RANDOM
  93.     "random"
  94. #else        
  95.     "fixed"
  96. #endif
  97.             );
  98.     }
  99.     
  100.     if (serialDevice = [[SerialCommDevice alloc] initPort:port atRate:baudRate]) {
  101.         sccOOLDelegate = [[MySCDDelegate alloc] init];
  102.         [serialDevice setDelegate:sccOOLDelegate];
  103.  
  104.         for(loop=0;loop<TRANSFERS;loop++) {
  105. #ifdef USE_RANDOM
  106.             len = random() % (BUFFER_SIZE/2);
  107.             for (i=0;i<(len/4);i++) {
  108.                 *((int *)oBuf+i) = random();
  109.             }
  110. #else USE_RANDOM        
  111.             len = FIXED_TRANSFER_SIZE;
  112.             for (i=0;i<len;i++) {
  113.                 oBuf[i] = (char)(' '+((loop+i)&63));
  114.             }
  115. #endif
  116.             if (debugFlag)
  117.                 fprintf(stderr,"\n%sing %d characters...\n",(readFlag)?"Read":"Writ",len);
  118.             if (readFlag) {
  119.                 if ((i = [serialDevice recv:iBuf maxLen:BUFFER_SIZE]) != len) {
  120.                     if (debugFlag)
  121.                         fprintf(stderr,"\nrecv failed - act:%d, exp:%d.\n",i,len);
  122.                     retVal = 2;
  123.                     break;
  124.                 } else if (bcmp(iBuf, oBuf, len)) {
  125.                     fprintf(stderr,"\nData Compare Error on loop %d.\n", loop);
  126. #ifndef USE_RANDOM                    
  127.                     fprintf(stderr,"\nExp:[%s]", oBuf);
  128.                     fprintf(stderr,"\nAct:[%s]\n", iBuf);                    
  129. #endif
  130.                     retVal = 3;
  131.                     break;
  132.                 } else if (loopBackFlag) {
  133.                     if ((transferTime = [serialDevice xmit:iBuf len:len]) < 0) {
  134.                         if (debugFlag);
  135.                             fprintf(stderr,"\n xmit failed:%d.\n", transferTime);
  136.                         retVal = 4;
  137.                         break;
  138.                     }
  139.                 }
  140.             } else { /* write transfer. */
  141. #ifdef TEST_ONLY            
  142.                 if ((transferTime = [serialDevice test:oBuf len:len]) < 0) {
  143. #else TEST_ONLY
  144.                 if ((transferTime = [serialDevice xmit:oBuf len:len]) < 0) {
  145. #endif TEST_ONLY
  146.                     if (debugFlag);
  147.                         fprintf(stderr,"\n xmit failed:%d.\n",transferTime);
  148.                     retVal = 5;
  149.                     break;
  150. #ifndef TEST_ONLY
  151.                 } else if (loopBackFlag) {
  152.                     if ((i = [serialDevice recv:iBuf maxLen:BUFFER_SIZE]) != len) {
  153.                         if (debugFlag);
  154.                             fprintf(stderr,"\nrecv failed - act:%d, exp:%d.\n",i, len);
  155.                         retVal = 6;
  156.                         break;
  157.                     }
  158. #endif
  159.                 }
  160.             }
  161.             if (!readFlag || (readFlag && loopBackFlag)) {
  162.                 if (debugFlag > 1)
  163.                     fprintf(stderr,"\n%d",transferTime);
  164.                 totalCharacters += len;
  165.                 if (transferTime < minTransferTime)
  166.                     minTransferTime = transferTime;
  167.                 if (transferTime > maxTransferTime)
  168.                     maxTransferTime = transferTime;
  169.                 totalTransfers++;
  170.                 totalTransferTime += transferTime;
  171.             }
  172.         }
  173.         if (debugFlag && totalTransfers)
  174.             fprintf(stderr, "\n%d characters in %d transfers with minTime=%d us maxTime=%d uSec avgTime=%d uSec "
  175.             "\n%6.1f Sec total transfer time giving %6.1f CPS effective transfer rate.\n",
  176.                 totalCharacters, totalTransfers, minTransferTime, maxTransferTime, totalTransferTime/totalTransfers, 
  177.                 (float)totalTransferTime/1000000.0, (float)totalCharacters/((float)totalTransferTime/1000000.0));
  178.     } else {
  179.         fprintf(stderr,"\ninitPort:atRate: failed.\n");
  180.         retVal = 7;
  181.     }
  182.     return retVal;
  183. }